/*
 * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.spi.servicecontext;

import org.omg.CORBA.BAD_PARAM;
import java.util.Vector;
import java.util.Enumeration;
import com.sun.corba.se.spi.servicecontext.ServiceContext;
import com.sun.corba.se.spi.servicecontext.ServiceContextData;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.impl.orbutil.ORBUtility;

public class ServiceContextRegistry {
    private ORB orb;
    private Vector scCollection;

    private void dprint(String msg) {
        ORBUtility.dprint(this, msg);
    }

    public ServiceContextRegistry(ORB orb) {
        scCollection = new Vector();
        this.orb = orb;
    }

    /** Register the ServiceContext class so that it will be recognized
     * by the read method.
     * Class cls must have the following properties:
     * <ul>
     * <li>It must derive from com.sun.corba.se.spi.servicecontext.ServiceContext.</li>
     * <li>It must have a public static final int SERVICE_CONTEXT_ID
     * member.</li>
     * <li>It must implement a constructor that takes a
     * org.omg.CORBA_2_3.portable.InputStream argument.</li>
     * </ul>
     */
    public void register(Class cls) {
        if (ORB.ORBInitDebug)
            dprint("Registering service context class " + cls);

        ServiceContextData scd = new ServiceContextData(cls);

        if (findServiceContextData(scd.getId()) == null)
            scCollection.addElement(scd);
        else
            throw new BAD_PARAM("Tried to register duplicate service context");
    }

    public ServiceContextData findServiceContextData(int scId) {
        if (ORB.ORBInitDebug)
            dprint("Searching registry for service context id " + scId);

        Enumeration enumeration = scCollection.elements();
        while (enumeration.hasMoreElements()) {
            ServiceContextData scd = (ServiceContextData) (enumeration.nextElement());
            if (scd.getId() == scId) {
                if (ORB.ORBInitDebug)
                    dprint("Service context data found: " + scd);

                return scd;
            }
        }

        if (ORB.ORBInitDebug)
            dprint("Service context data not found");

        return null;
    }
}
